AWS SaaS Boostを触ってみる #2 Blitz.jsのサンプルアプリケーションをテナントとしてデプロイする
CX事業本部 MADチームの佐藤です。AWS SaaS Boostを触ってみる記事の2回目です。前回の記事はこちら
AWS SaaS BoostをAWSにデプロイしてログインするところまでを確認しました。今回は、実際にサンプルアプリケーションを作成しECRリポジトリにDockerイメージを置いて、1つのテナントととしてデプロイします。
AWS SaaS Boostにおけるテナントの構成
AWS SaaS Boostでは、テナントを以下のような構成でデプロイします。顧客ごとにVPC、RDSなどのリソースが独立する構成になります。このようなSaaSの構成をサイロ化モデルと言うらしいです。以下のAWS Innovateのスライドがわかりやすいです。
ECRのリポジトリのイメージがPushされると、各テナントへ Rolling Update を行い全てのテナントのアプリケーションが一斉に更新されます。
サンプルアプリケーションを作成する
ということで、さっそくAWS SaaS Boostにデプロイするためのサンプルアプリケーションを作成します。AWS Saas Boostがモノリスアプリケーションをターゲットにしているので、個人的に気になっているTypeScriptのフルスタックフレームワークである Blitz.js を使ってみようと思います。Blitz.jsのチュートリアルをベースに進めていきます。
https://blitzjs.com/docs/tutorial
Blitz.jsのインストール
Blitz.jsのcliをインストールします。yarnかnpmでインストールします。
yarn global add blitz
Blitz.jsプロジェクトの作成
プロジェクトを作成します。
blitz new aws-saas-boost-deploy-sample
作成したら、プロジェクトディレクトリに移動し起動することを確認します。
cd aws-saas-boost-deploy-sample blitz dev
これでサンプルとなるアプリケーション(cliで作っただけですが...)ができましたので、AWS SaaS BoostでデプロイするためにDockerでコンテナ化をします。
Dockerでコンテナ化し、ECRにプッシュする
AWS SaaS BoostではECRリポジトリにあるイメージからテナントをデプロイするので、ECRにイメージを保存するためにDockerでコンテナ化します。ビルドしてイメージを作成します。まずは、以下のDockerfileをディレクトリのルートに作成します。これは、blitz.jsのアプリケーションをビルドし3000ポートで実行するDockerfileです。
FROM node:14-stretch-slim as base WORKDIR /opt/app COPY . . RUN apt-get update && apt-get install openssl -y && rm -rf /var/lib/apt/lists/* RUN yarn install RUN yarn blitz prisma generate RUN yarn build FROM node:14-stretch-slim as prod COPY --from=base /opt/app/package.json /opt/app/blitz.config.ts ./ COPY --from=base /opt/app/node_modules ./node_modules COPY --from=base /opt/app/public ./public COPY --from=base /opt/app/.blitz ./.blitz COPY --from=base /opt/app/.next ./.next CMD yarn start
前回の記事で AWS SaaS Boostをデプロイした際に一緒にECRもデプロイされていると思います。 sb-dev-core*
からはじまるリポジトリが作成されていますので、そこにアップロードします。まずは、ECRにログインします。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
Dockerfileをビルドします。
docker build -t aws-saas-boost-sample-app" .
ECRアップロード用のタグを付けます。ECRのリポジトリ情報は前回デプロイされた SaaS Boostの管理画面から確認できます。
docker tag aws-saas-boost-sample-app:latest xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sb-dev-core-xxxxxxxx-ecsrepository-xxxxxxxxx:latest
ECRにプッシュします。イメージのサイズが大きいので時間がかかりますが、気長に待ちます。
docker push xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sb-dev-core-xxxxxxxx-ecsrepository-xxxxxxxxx:latest
ECRにlatestタグとして登録されていることを確認します。
ECRにプッシュできましたので、次にAWS Saas Boostを使って最初のテナントを作成します。
AWS SaaS Boostの管理画面からサンプルアプリケーションをテナントとしてデプロイする
サンプルアプリケーションのイメージをECRにPushできましたので、AWS SaaS Boostを使ってテナントアプリケーションとしてデプロイしていきます。
管理画面でインフラの設定を行う
まずは、AWS Saas Boostの管理画面にログインして、 Application
メニューを選択します。この画面ではテナントごとのアプリケーションインフラの設定情報を管理します。カスタムドメインの設定や、Auto Scaling、課金、DB、ファイルシステムの設定をすることができます。今回は以下のように入力しました。DBはローカルのSQLiteを使う設定なので、今回は設定しません。次回以降の記事では、データベースを考慮したテナントデプロイもやっていきます。
Application
- Name: saas-boost-sample-app
- Compute Size: Small
- Container Port: 3000
- Minimum Instance Count: 1
- Maximum Instance Count: 2
- Container OS: Linux
- Health Check URL: /
ここで設定した値をもとに、CloudFormationでその顧客テナントごとのインフラがデプロイされることになります。
オンボーディングサービスを利用して、テナントを作成する
テナント作成するためには、 Onboading
サービスを使用します。メニューから Onboading
を選択し、右上の Provisioned Tenant
をクリックします。テナントの設定画面になりますので、テナント名を入力して、Submitをクリックします。これで、さきほどの設定値に沿ったテナントアプリケーションがデプロイされます。
CloudFormationを確認するとテナント用のスタックがデプロイされているのがわかります。新しいテナントを作成すると、自動的にVPC周りの設定、ALB、ECS、RDSなどのリソースをデプロイしてくれます。
作成されたテナントリソースを確認する
Onboading
サービスでのテナントのプロビジョニングが終わりました。管理画面の Tenants
というメニューを開くと作成されたテナントの情報が確認できます。
上のLoad Balancer DNSをクリックしてデプロイされたアプリケーションにアクセスできました。
まとめ
サンプルアプリケーションをECRにPushし、AWS SaaS Boostの管理画面を使って、最初のテナントを作成するところまでを行いました。コンテナアプリケーションさえあれば、デプロイ自体は簡単に行えることがわかりました。次の記事では、カスタムドメインで複数のテナントをデプロイし、各テナントをサブドメインに振り分けるまでを行いたいと思います。